package cn.source.zk.domain.result;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

@Data
@NoArgsConstructor
public class DynamicTableDataResult {
    // 存储所有表的数据，每个表对应两列（字段名和值）
    private List<List<Object>> rows = new ArrayList<>();
    private List<String> columns = new ArrayList<>();

    // 新增：存储列的显示顺序
    private List<Integer> columnOrder = new ArrayList<>();
    // 新增：存储隐藏的列索引
    private Set<Integer> hiddenColumns = new HashSet<>();

    // 添加一个表的数据
    public void addTableData(String tableName, Map<String, Object> tableData) {
        // 添加列名（如果尚未添加）
        if (!columns.contains(tableName + "指标")) {
            columns.add(tableName + "指标");
            columns.add(tableName + "值");
            // 新增：默认添加到列顺序的末尾
            columnOrder.add(columns.size() - 2);
            columnOrder.add(columns.size() - 1);
        }

        // 将表数据转换为行
        List<Map.Entry<String, Object>> entries = new ArrayList<>(tableData.entrySet());

        // 确保rows有足够的行
        while (rows.size() < entries.size()) {
            List<Object> newRow = new ArrayList<>();
            // 为每一列初始化null值
            for (int i = 0; i < columns.size(); i++) {
                newRow.add(null);
            }
            rows.add(newRow);
        }

        // 填充数据
        int columnIndex = columns.indexOf(tableName + "指标");
        for (int i = 0; i < entries.size(); i++) {
            Map.Entry<String, Object> entry = entries.get(i);
            List<Object> row = rows.get(i);

            // 确保行有足够的列
            while (row.size() < columns.size()) {
                row.add(null);
            }

            // 设置字段名和值
            row.set(columnIndex, entry.getKey());
            row.set(columnIndex + 1, entry.getValue());
        }
    }

    // 新增：设置列的显示顺序
    public void setColumnOrder(List<Integer> newOrder) {
        // 验证新顺序是否有效
        if (newOrder.size() != columns.size()) {
            throw new IllegalArgumentException("新的列顺序必须包含所有列");
        }

        for (Integer index : newOrder) {
            if (index < 0 || index >= columns.size()) {
                throw new IllegalArgumentException("列索引无效: " + index);
            }
        }

        this.columnOrder = new ArrayList<>(newOrder);
    }

    // 新增：隐藏指定的列
    public void hideColumns(List<Integer> columnsToHide) {
        for (Integer index : columnsToHide) {
            if (index >= 0 && index < columns.size()) {
                hiddenColumns.add(index);
            }
        }
    }

    // 新增：显示所有列
    public void showAllColumns() {
        hiddenColumns.clear();
    }

    // 新增：获取排序并过滤后的列
    public List<String> getVisibleColumns() {
        List<String> visibleColumns = new ArrayList<>();
        for (Integer index : columnOrder) {
            if (!hiddenColumns.contains(index)) {
                visibleColumns.add(columns.get(index));
            }
        }

        // 修改索引为0的值（如果存在）
        if (!visibleColumns.isEmpty()) {
            visibleColumns.set(0,"数据名称");
            visibleColumns.set(1,"实测值");
            visibleColumns.set(2,"谐波次数");
            visibleColumns.set(3,"UA");
            visibleColumns.set(4,"UB");
            visibleColumns.set(5,"UC");
            visibleColumns.set(6,"IA");
            visibleColumns.set(7,"IB");
            visibleColumns.set(8,"IC");
            visibleColumns.set(9,"间谐波");
            visibleColumns.set(10,"UA");
            visibleColumns.set(11,"UB");
            visibleColumns.set(12,"UC");
            visibleColumns.set(13,"IA");
            visibleColumns.set(14,"IB");
            visibleColumns.set(15,"IC");
        }
        return visibleColumns;
    }

    // 新增：获取排序并过滤后的行数据
    public List<List<Object>> getVisibleRows() {
        List<List<Object>> visibleRows = new ArrayList<>();
        for (List<Object> row : rows) {
            List<Object> visibleRow = new ArrayList<>();
            for (Integer index : columnOrder) {
                if (!hiddenColumns.contains(index)) {
                    visibleRow.add(row.get(index));
                }
            }
            visibleRows.add(visibleRow);
        }
        return visibleRows;
    }
}
